package com.itany.shop.listener;

import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * Author:shixiaojun@itany.com
 * Date:2022/4/20 11:39
 * Version:1.0-SNAPSHOT
 * Description:
 */
@WebListener
public class CountPeopleListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent event) {
        System.out.println("正在上线");
        // 由于是统计整个项目中的人数
        // 此时的数据要对整个项目都生效
        // 因此,选择application作为作用域数据
        // 获取application对象
        ServletContext application = event.getSession().getServletContext();

        // 由于项目可以被无数人访问,因此需要考虑并发问题
        // 加把锁
        synchronized (this){
            // 获取此时存放在application作用域中的人数
            Integer count = (Integer) application.getAttribute("count");
            // 如果是第一个上线的人,此时作用域中没有数据
            // 则需要将默认值设置为1
            if(null == count){
                count = 1;
            }else{
                count++;
            }
            application.setAttribute("count",count);
        }
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        System.out.println("正在下线");
        ServletContext application = event.getSession().getServletContext();
        synchronized (this){
            Integer count = (Integer) application.getAttribute("count");
            // 由于销毁一定在创建之后,因此此处一定取到值
            count-=1;
            application.setAttribute("count",count);
        }
    }
}
